iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0

前言

我們已經將NFT的合約大致上都部署好了,不過,如果今天我們想要限制錢包購買次數怎麼辦?今天我們就來討論怎麼去增加限制,讓一個人只能mint一個NFT,話不多說,開始實作!


正文

|撰寫|

我們先把昨天完成的程式碼叫出來,然後打開Remix,詳情請見Day 28。大致上程式碼都差不多,不過我們者邊需要增加一項限制,也就是一個人只能mint一個NFT

    uint256 MAX_SUPPLY = 10;
    uint256 MAX_PER_WALLET = 1;
    string baseURI = "ipfs://QmXRDUWjxtbBPjoDTRVayEFx6N41YgJFKtZy2GBzpkz3RQ/";

在設定資料的時候多設定一項,一個錢包的最大mint限制。

    uint256 tokenId = _tokenIdCounter.current();
    require (tokenId < MAX_SUPPLY, "All NFT have been minted.");
    require (balanceOf(msg.sender) < MAX_PER_WALLET, " One 'I'mma Man NFT' per ppl");

昨天有說到msg.sender是一個可以偵測使用者錢包的一個功能,因此,需要設定一個條件,也就是需要該使用者錢包裡的NFT需要小於一個錢包的最大供給量,否則就會跳出失敗訊息,一個人只能mint一個NFT。

|編譯推送|

先編譯看程式碼有沒有問題

https://ithelp.ithome.com.tw/upload/images/20221007/20152558n7hlfdGJkX.png

再將合約上鏈

https://ithelp.ithome.com.tw/upload/images/20221007/20152558nLVmNAAl9z.png

我們再點選Safe Mint

https://ithelp.ithome.com.tw/upload/images/20221012/20152558WKKkINp120.png

連接錢包後等待成功

https://ithelp.ithome.com.tw/upload/images/20221007/20152558OBOqOA9P5d.png

再點選一次SafeMint

https://ithelp.ithome.com.tw/upload/images/20221014/20152558tcPBYj0562.png

如果你的電腦有跳出失敗訊息,就代表你成功了!因為失敗為成功之母/images/emoticon/emoticon01.gif

|上鏈到正式鏈!!|

當確定在測試鏈的功能都沒問題後,我們就可以把合約推送至以太鏈主網,也就是正式鏈上了
需要注意的就是要把之前狐狸錢包的測試鏈改成以太鏈主網,deploy時會顯示下面告示
https://ithelp.ithome.com.tw/upload/images/20221014/201525588er1oILjMd.png
大致上內容就是可以調整max gwei就可以在你想要的gas時進行上鏈。
之後只需要將你的合約驗證到以太鏈上就完成了。
怎麼驗證合約點我

下面是我驗證以太坊的網址,有興趣的也可以在以太鏈mint我的I'mma Man NFT
https://etherscan.io/address/0xfa21b2d4a50517b792e026c336205ac838c0524e#writeContract
https://ithelp.ithome.com.tw/upload/images/20221014/20152558uzrdGKkv8Z.png

|怎麼在Etherscan Mint NFT呢?|

先打開 Etherscan 連結
https://etherscan.io/address/0xfa21b2d4a50517b792e026c336205ac838c0524e#writeContract
連接錢包
https://ithelp.ithome.com.tw/upload/images/20221014/20152558FWbBC4VnVk.png
點選SafeMint
https://ithelp.ithome.com.tw/upload/images/20221014/20152558wBhZsGfoP7.png
點選Write就可以執行了!
https://ithelp.ithome.com.tw/upload/images/20221014/20152558AwFgCEJATQ.png

小結

今天的優化也完成了,大致上的成品就長這個樣子,不過NFT不只能是圖片,還可以是音樂,甚至有些NFT可以跟我們進行互動,現在很多項目也是使用盲盒機制,這些都是大家之後可以去更深入了解的。


完整程式碼

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyToken is ERC721, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    uint256 MAX_SUPPLY = 10;
    string baseURI = "ipfs://QmXRDUWjxtbBPjoDTRVayEFx6N41YgJFKtZy2GBzpkz3RQ/";

    string public baseExtension = ".json";

    constructor() ERC721("I'mma Man NFT", "IMMN") {}

    function safeMint() public {
        uint256 tokenId = _tokenIdCounter.current();
        require (tokenId < MAX_SUPPLY, "All NFT have been minted.");
        string memory uri = string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension));
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, uri);
    }

    // The following functions are overrides required by Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
}

上一篇
Day 28 | 一個NFT不夠?直接給你一組!三分鐘學會製作一系列 NFT!(二)程式編譯
下一篇
Day 30 | 完賽心得
系列文
2022最火話題NFT到底是什麼?釐清NFT和虛擬貨幣以及區塊鏈的關係,做出自己專屬的NFT!!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言